From 40e53492ab2826edf992f4e8d3bf61ca96dfb00f Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Mon, 22 Mar 2021 18:01:39 +0100 Subject: [PATCH] keyboard: Allow calling _release() without press on OSK keys with touch This is already allowed for pointer events, but touch events still expected that the touch begin and end happen on the same Key actor. Change this behavior for touch events, this is necessary for the tap-drag-release pattern to select key variants to work on all input devices. Part-of: --- js/ui/keyboard.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js index 10a21cbe0..c6d6fab60 100644 --- a/js/ui/keyboard.js +++ b/js/ui/keyboard.js @@ -347,7 +347,7 @@ var Key = GObject.registerClass({ this.emit('long-press'); if (this._extendedKeys.length > 0) { - this._touchPressed = false; + this._touchPressSlot = null; this._ensureExtendedKeysPopup(); this.keyButton.set_hover(false); this.keyButton.fake_release(); @@ -378,7 +378,7 @@ var Key = GObject.registerClass({ GLib.source_remove(this._pressTimeoutId); this._pressTimeoutId = 0; } - this._touchPressed = false; + this._touchPressSlot = null; this.keyButton.set_hover(false); this.keyButton.fake_release(); } @@ -459,14 +459,19 @@ var Key = GObject.registerClass({ if (!Meta.is_wayland_compositor()) return Clutter.EVENT_PROPAGATE; - if (!this._touchPressed && + const slot = event.get_event_sequence().get_slot(); + + if (!this._touchPressSlot && event.type() == Clutter.EventType.TOUCH_BEGIN) { - this._touchPressed = true; + this._touchPressSlot = slot; this._press(key); - } else if (this._touchPressed && - event.type() == Clutter.EventType.TOUCH_END) { - this._touchPressed = false; - this._release(key); + } else if (event.type() === Clutter.EventType.TOUCH_END) { + if (!this._touchPressSlot || + this._touchPressSlot === slot) + this._release(key); + + if (this._touchPressSlot === slot) + this._touchPressSlot = null; } return Clutter.EVENT_PROPAGATE; }); -- 2.39.5